package ctype

import (
	"database/sql/driver"
	"encoding/json"
	"time"
)

// Msg 文本类型
type Msg struct {
	Type         int8          `json:"type"`         // 消息类型 和 MsgType 一模一样
	Content      *string       `json:"content"`      // Msg == 1  文本类型
	ImageMsg     *ImageMsg     `json:"imageMsg"`     // Msg == 2  图片消息
	VideoMsg     *VideoMsg     `json:"videoMsg"`     // Msg == 3  视频消息
	FileMsg      *FileMsg      `json:"fileMsg"`      // Msg == 4  文件消息
	VoiceMsg     *VoiceMsg     `json:"voiceMsg"`     // Msg == 5  语音消息
	VoiceCallMsg *VoiceCallMsg `json:"voiceCallMsg"` // Msg == 6  语音通话
	VideoCallMsg *VideoCallMsg `json:"videoCallMsg"` // Msg == 7  视频通话
	WithdrawMsg  *WithdrawMsg  `json:"withdrawMsg"`  // Msg == 8  撤回消息
	ReplyMsg     *ReplyMsg     `json:"replyMsg"`     // Msg == 9  回复消息
	QuoteMsg     *QuoteMsg     `json:"quoteMsg"`     // Msg == 10  引用消息
	AtMsg        *AtMsg        `json:"atMsg"`        // Msg == 11  @ 消息 群聊支持
}

// Scan 取出来的时候的数据
func (c *Msg) Scan(val interface{}) error {
	return json.Unmarshal(val.([]byte), c)
}

// Value 入库的数据
func (c Msg) Value() (driver.Value, error) {
	b, err := json.Marshal(c)
	return string(b), err
}

// ImageMsg 图片消息
type ImageMsg struct {
	Title string `json:"title"`
	Src   string `json:"src"`
}

// VideoMsg 视频消息
type VideoMsg struct {
	Title string `json:"title"` // 视频名称
	Src   string `json:"src"`   // 视频地址
	Time  int    `json:"time"`  // 时长 单位秒
}

// FileMsg 文件消息
type FileMsg struct {
	Title string `json:"title"`
	Src   string `json:"src"`
	Size  int64  `json:"size"` // 文件大小
	Type  string `json:"type"` // 文件后缀
}

// VoiceMsg 语音消息
type VoiceMsg struct {
	Src  string `json:"src"`  // 音频地址
	Time int    `json:"time"` // 时长 单位秒
}

// VoiceCallMsg 语音通话
type VoiceCallMsg struct {
	StartTime time.Time `json:"startTime"` // 开始时间
	EndTime   time.Time `json:"endTime"`   // 结束时间
	EndReason int8      `json:"endReason"` // 结束原因 0: 发起方挂断 1: 接收方挂断 2: 网络原因 3: 未打通
}

// VideoCallMsg 视频通话
type VideoCallMsg struct {
	StartTime time.Time `json:"startTime"` // 开始时间
	EndTime   time.Time `json:"endTime"`   // 结束时间
	EndReason int8      `json:"endReason"` // 结束原因 0: 发起方挂断 1: 接收方挂断 2: 网络原因 3: 未打通
}

// WithdrawMsg 撤回消息
type WithdrawMsg struct {
	Content   string `json:"content"` // 撤回的提示词
	OriginMsg *Msg   `json:"-"`       // 原消息
}

// ReplyMsg 回复消息
type ReplyMsg struct {
	MsgID   uint   `json:"msgID"`   // 消息id
	Content string `json:"content"` // 回复的文本消息
	Msg     *Msg   `json:"msg"`
}

// QuoteMsg 引用消息
type QuoteMsg struct {
	MsgID   uint   `json:"msgID"`   // 消息id
	Content string `json:"content"` // 回复的文本消息
	Msg     *Msg   `json:"msg"`
}

// AtMsg @消息
type AtMsg struct {
	UserID  uint   `json:"userID"`  // 用户id
	Content string `json:"content"` // 回复的文本消息
	Msg     *Msg   `json:"msg"`
}
